原始题目:剑指 Offer 15. 二进制中1的个数 (opens new window)

解题思路:

首先介绍一个位操作,当 n0n \neq 0 时,nn & (n1)(n-1) 会消除掉 nn 最右边的 11,举个例子:

假设 n=1010n = 1010,则 n1=1001n - 1 = 1001m=nm = n & (n1)=1000(n -1 ) = 1000mmnn 的对比之下,是否是 nn 最右边的 11 变成了 00 就是 mm 了。

n=1010m=1000n = 1010 \\ m = 1000

因此,每进行一次上述操作,nn 就会消掉一个 11,能进上多少次上述操作,说明 nn 就有多少个 11

代码:

public int hammingWeight(int n) {
    int c = 0;
    while (n != 0) {
        c++;
        n = n & (n - 1);
    }
    return c;
}
1
2
3
4
5
6
7
8

复杂度分析

  • 时间复杂度O(N)O(N)NNnn 的二进制 11 的个数。

  • 空间复杂度O(1)O(1): 变量 cc 使用常数大小额外空间。

上次更新: 2023/10/15